import { GlobalEnum } from "../GameSpecial/GlobalEnum";
import LevelDataTemplate from "../GameSpecial/LevelDataTemplate";
import MapData from "../GameSpecial/MapData";
import CollItemDataTemplate from "../GameSpecial/CollItemDataTemplate";

/**游戏JSON数据管理器 */
export default class GameData {
    /**
     * 记录所有游戏数据，
     * key:数据类型枚举值；
     * value:数据
     */
    private static data: { [key: string]: any } = {};
    public static init() {
        this.data = {};
        this.levelData = {};
        //一些常见的数据类型，使用默认数据进行初始化
        //关卡：
        // this.data[GlobalEnum.GameDataType.levelData] = LevelDataTemplate.getData();
        // this.levelData = this.data[GlobalEnum.GameDataType.levelData];
        this.data[GlobalEnum.GameDataType.CollItemData] = CollItemDataTemplate.getData();
    }

    public static setData(res: any[], urls: string[]) {
        for (let key in GlobalEnum.GameDataType) {
            let index = this.getUrlsIndex(GlobalEnum.GameDataType[key], urls);
            if (index >= 0) {
                this.data[GlobalEnum.GameDataType[key]] = res[index].json;
            } else {
                console.warn("数据类型不存在：", GlobalEnum.GameDataType[key]);
            }
        }
        //数据从数组转换为对象
        for (let key in GlobalEnum.GameDataType) {
            let type = GlobalEnum.GameDataType[key];
            if (!!this.data[type] && Array.isArray(this.data[type])) {
                let arr = this.data[type];
                let d = {};
                for (let i = arr.length - 1; i >= 0; --i) {
                    d[arr[i].id] = arr[i];
                }
                this.data[type] = d;
            }
        }
        // this.levelData = this.data[GlobalEnum.GameDataType.levelData];
    }
    /**获取数据类型字符串在资源url数组中的索引 */
    private static getUrlsIndex(name: string, urls: string[]): number {
        for (let i = urls.length - 1; i >= 0; --i) {
            if (urls[i].indexOf(name) >= 0) {
                return i;
            }
        }
        return -1;
    }

    /**解析关卡数据 */
    public static processLevelData(str: string) {
        let levelData = [];
        let scope = {
            xMin: 0,
            xMax: 0,
            yMin: 0,
            yMax: 0,
        };

        return {
            levelData: levelData,
            scope: scope,
        };
    }


    /**添加记录数据 */
    public static addData(type, data: any) {
        if (!!this.data[type]) {
            console.warn("对应类型的数据已经存在，请检查类型是否重名:", type);
            return;
        }
        this.data[type] = data;
    }

    /**
     * 获取游戏数据
     * @param type  数据类型枚举值
     * @param key   需要的具体数据
     */
    public static getData(type, key?: any) {
        if (undefined === this.data[type]) {
            console.warn("不存在对应类型的数据：", type);
            return null;
        }
        if (undefined === key) {
            return this.data[type];
        } else {
            return this.data[type][key];
        }
    }


    /**本游戏中关卡数据源文件为每个关卡一个.txt文件，故单独处理 */
    protected static levelData = {};
    /**关卡数据 */
    public static getLevelData(lv: number, cb?: (data) => void) {
        MapData.createRandomMap(lv);
        let data = {
            id: lv,
            lv: lv,
            data: MapData.getLevelItem(),
        }
        cb(data);
    }

}